Fix the GtkBuildable implementation to allow setting column types.
authorMatthias Clasen <mclasen@redhat.com>
Mon, 19 Nov 2007 05:47:36 +0000 (05:47 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 19 Nov 2007 05:47:36 +0000 (05:47 +0000)
2007-11-19  Matthias Clasen  <mclasen@redhat.com>

        * gtk/gtktreestore.c: Fix the GtkBuildable implementation
        to allow setting column types.  (#496795, James Stephenson)

svn path=/trunk/; revision=19001

ChangeLog
gtk/gtktreestore.c

index 6b60b761001518b25e199f674ef142bffe156c66..f1801b26a90d1792e496e662f670330a5a301a1b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-11-19  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtktreestore.c: Fix the GtkBuildable implementation
+       to allow setting column types.  (#496795, James Stephenson)
+
 2007-11-19  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkmain.[hc]: Make gtk_check_version() return const.
index 730c942f5b30c37ce7246ed6e47559c9ed0fbaae..ecc42715471b0f2022ddfdbd6c2b295e636f1d9d 100644 (file)
@@ -3207,6 +3207,7 @@ validate_gnode (GNode* node)
  * </columns>
  */
 typedef struct {
+  GtkBuilder *builder;
   GObject *object;
   GSList *items;
 } GSListSubParserData;
@@ -3229,9 +3230,55 @@ tree_model_start_element (GMarkupParseContext *context,
     }
 }
 
+static void
+tree_model_end_element (GMarkupParseContext *context,
+                       const gchar         *element_name,
+                       gpointer             user_data,
+                       GError             **error)
+{
+  guint i;
+  GSListSubParserData *data = (GSListSubParserData*)user_data;
+
+  g_assert(data->builder);
+
+  if (strcmp (element_name, "columns") == 0)
+    {
+      GSList *l;
+      GType *types;
+      int i;
+      GType type;
+
+      data = (GSListSubParserData*)user_data;
+      data->items = g_slist_reverse (data->items);
+      types = g_new0 (GType, g_slist_length (data->items));
+
+      for (l = data->items, i = 0; l; l = l->next, i++)
+        {
+          type = gtk_builder_get_type_from_name (data->builder, l->data);
+          if (type == G_TYPE_INVALID)
+            {
+              g_warning ("Unknown type %s specified in treemodel %s",
+                         (const gchar*)l->data,
+                         gtk_buildable_get_name (GTK_BUILDABLE (data->object)));
+              continue;
+            }
+          types[i] = type;
+
+          g_free (l->data);
+        }
+
+      gtk_tree_store_set_column_types (GTK_TREE_STORE (data->object), i, types);
+
+      g_free (types);
+    }
+  else if (strcmp (element_name, "column") == 0)
+    ;
+}
+
 static const GMarkupParser tree_model_parser =
   {
-    tree_model_start_element
+    tree_model_start_element,
+    tree_model_end_element
   };
 
 
@@ -3251,6 +3298,7 @@ gtk_tree_store_buildable_custom_tag_start (GtkBuildable  *buildable,
   if (strcmp (tagname, "columns") == 0)
     {
       parser_data = g_slice_new0 (GSListSubParserData);
+      parser_data->builder = builder;
       parser_data->items = NULL;
       parser_data->object = G_OBJECT (buildable);
 
@@ -3269,37 +3317,13 @@ gtk_tree_store_buildable_custom_finished (GtkBuildable *buildable,
                                          const gchar  *tagname,
                                          gpointer      user_data)
 {
-  GSList *l;
   GSListSubParserData *data;
-  GType *types;
-  int i;
-  GType type;
 
   if (strcmp (tagname, "columns"))
     return;
 
   data = (GSListSubParserData*)user_data;
-  data->items = g_slist_reverse (data->items);
-  types = g_new0 (GType, g_slist_length (data->items));
-
-  for (l = data->items, i = 0; l; l = l->next, i++)
-    {
-      type = gtk_builder_get_type_from_name (builder, l->data);
-      if (type == G_TYPE_INVALID)
-       {
-         g_warning ("Unknown type %s specified in treemodel %s",
-                    (const gchar*)l->data,
-                    gtk_buildable_get_name (GTK_BUILDABLE (data->object)));
-         continue;
-       }
-      types[i] = type;
-
-      g_free (l->data);
-    }
-
-  gtk_tree_store_set_column_types (GTK_TREE_STORE (data->object), i, types);
 
-  g_free (types);
   g_slist_free (data->items);
   g_slice_free (GSListSubParserData, data);
 }